#include <iostream>
#include <memory>
#include <vector>
#include <string>

class Resource {
private:
    std::string name;
    int id;
    
public:
    Resource(const std::string& n, int i) : name(n), id(i) {
        std::cout << "创建资源: " << name << " (ID: " << id << ")" << std::endl;
    }
    
    ~Resource() {
        std::cout << "销毁资源: " << name << " (ID: " << id << ")" << std::endl;
    }
    
    void doWork() {
        std::cout << name << " 正在工作..." << std::endl;
    }
    
    std::string getName() const { return name; }
};

void uniquePtrExample() {
    std::cout << "\n=== unique_ptr 示例 ===" << std::endl;
    
    // unique_ptr 拥有独占所有权
    auto resource1 = std::make_unique<Resource>("数据库连接", 1);
    resource1->doWork();
    
    // 可以转移所有权
    auto resource2 = std::move(resource1);
    // 此时 resource1 为 nullptr
    
    if (! resource1) {
        std::cout << "resource1 已经转移了所有权" << std::endl;
    }
    
    resource2->doWork();
    
    // 当 resource2 离开作用域时，资源会自动释放
}

void sharedPtrExample() {
    std::cout << "\n=== shared_ptr 示例 ===" << std::endl;
    
    // shared_ptr 允许多个指针共享同一个资源
    auto resource1 = std::make_shared<Resource>("网络连接", 2);
    std::cout << "引用计数: " << resource1.use_count() << std::endl;
    
    {
        auto resource2 = resource1; // 复制 shared_ptr
        std::cout << "引用计数: " << resource1.use_count() << std::endl;
        
        auto resource3 = resource1; // 再次复制
        std::cout << "引用计数: " << resource1.use_count() << std::endl;
        
        resource2->doWork();
        // resource2 和 resource3 在这里离开作用域
    }
    
    std::cout << "内部作用域结束后，引用计数: " << resource1.use_count() << std::endl;
    // 当最后一个 shared_ptr 离开作用域时，资源才会被释放
}

void weakPtrExample() {
    std::cout << "\n=== weak_ptr 示例 ===" << std::endl;
    
    std::weak_ptr<Resource> weakResource;
    
    {
        auto sharedResource = std::make_shared<Resource>("缓存数据", 3);
        weakResource = sharedResource; // weak_ptr 不增加引用计数
        
        std::cout << "shared_ptr 引用计数: " << sharedResource.use_count() << std::endl;
        
        // 通过 weak_ptr 安全地访问资源
        if (auto lockedResource = weakResource.lock()) {
            lockedResource->doWork();
            std::cout << "通过 weak_ptr 成功访问资源" << std::endl;
        }
        
        // sharedResource 在这里离开作用域
    }
    
    // 尝试访问已经被释放的资源
    if (auto lockedResource = weakResource.lock()) {
        std::cout << "资源仍然存在" << std::endl;
    } else {
        std::cout << "资源已经被释放，weak_ptr 检测到了这一点" << std::endl;
    }
}

int main() {
    uniquePtrExample();
    sharedPtrExample();
    weakPtrExample();
    
    std::cout << "\n 所有示例完成" << std::endl;
    return 0;
}